package br.com.tcc.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import br.com.tcc.model.Anunciante;



public class AnuncianteDAO {
	
	Logger logger = Logger.getLogger(AnuncianteDAO.class);
	
	private EntityManagerFactory emf;

	public AnuncianteDAO() {
		emf = Persistence.createEntityManagerFactory("persistencia");
	}
	
	public Anunciante buscarId(int idAnunciante){
		Anunciante retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	retorno = em.find(Anunciante.class, idAnunciante);
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		return retorno;
	}

	/**
	 * Buscar se um CNPJ ja esta cadastrado
	 * @param cnpj
	 * @return
	 */
	public boolean validarCNPJCadastrado(String cnpj) {
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select a from Anunciante a where a.cnpj=:cnpj");
		   	q.setParameter("cnpj", cnpj);
	
		   	if(q.getResultList().size()>0){
		   		retorno = true;
		   	}
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}
	/**
	 * Buscar se um CNPJ ja esta cadastrado
	 * @param cnpj
	 * @return
	 */
	public List<Anunciante> validarAnuncianteJaCadastrado(String cnpj, String cep) {
		List<Anunciante> retorno = null;
		EntityManager em = emf.createEntityManager();
		
		try {
			em.getTransaction().begin();
			Query q = em.createQuery("select a from Anunciante a where a.cnpj =:cnpj");
			q.setParameter("cnpj", cnpj);
			
	   		retorno = q.getResultList();
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}
	
	/**
	 * Alterar dados do cadastro de um anunciante
	 * @param Anunciante
	 * @return boolean
	 */
	public boolean alterar(Anunciante a){
		boolean retorno = true;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	em.merge(a);
		   	em.getTransaction().commit();
		}catch(Exception e){
			em.getTransaction().rollback();
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			retorno = false;
		}finally{
			em.close();
		}
		return retorno;
	}
	
	/**
	 * Validar se o email informado ja existe
	 * @param email
	 * @return
	 */
	public boolean validarEmail(String email) {
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		
		try {
			em.getTransaction().begin();
			Query q = em.createQuery("select a from Anunciante a where a.email =:email");
			q.setParameter("email", email);
			
			if(q.getResultList().size()>0){
		   		retorno = true;
			}
		} catch (NoResultException e) {
			logger.info("sem registro");
		} catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		} finally {
			em.close();
		}
			
		return retorno;
	}
	
	/**
	 * Salvar um anunciante na tabela
	 * @param anunciante
	 * @return
	 */
	public boolean adicionar(Anunciante anunciante) {
		EntityManager em = emf.createEntityManager();
		boolean retorno = true;
		try{
			em.getTransaction().begin();
			em.persist(anunciante);
			em.getTransaction().commit();
		}catch(Exception e){
			em.getTransaction().rollback();
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			retorno = false;
		}finally{
			em.close();
		}
	   	return retorno;
	}

	/**
	 * Buscar todos os anunciantes ativos
	 * @return
	 */
	public List<Anunciante> buscarAnunciantesAtivos() {
			List<Anunciante> retorno = null;
			EntityManager em = emf.createEntityManager();
			try{
			   	em.getTransaction().begin();
			   	Query q = em.createQuery("select a from Anunciante a  where a.status=:status order by a.razaoSocial");
			   	q.setParameter("status", "A");
			   	retorno = q.getResultList();
			}catch (NoResultException e) {
				logger.info("sem registro");
			}catch (Exception e) {
				 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			}finally{
				em.close();
			}
			return retorno;
	}
	
	public List<Anunciante> buscarTodosAnunciantes() {
		List<Anunciante> retorno = null;
		EntityManager em = emf.createEntityManager();
		try {
			em.getTransaction().begin();
			Query q = em
					.createQuery("select a from Anunciante a order by a.razaoSocial");
			retorno = q.getResultList();
		} catch (NoResultException e) {
			logger.info("sem registro");
		} catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		} finally {
			em.close();
		}
		return retorno;
	}


	public boolean alterarStatus(int idAnunciante, String status) {
		boolean erro = true;
		
		EntityManager em = emf.createEntityManager();
		
		try {
			em.getTransaction().begin();
			Query q = em.createQuery("update Anunciante a SET a.status= :status WHERE  a.idAnunciante = :idAnunciante");
			q.setParameter("status", status.trim());
			q.setParameter("idAnunciante", idAnunciante);
			q.executeUpdate(); 
		 	em.getTransaction().commit();
		}catch(NoResultException e){
			erro = false;
			logger.info("Sem registro");
		} catch (Exception e) {
			erro = false;
		}finally{
			em.close();
		}
		
		return erro;
	}


	public Anunciante buscarPeloSite(String site) {
		Anunciante retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select a from Anunciante a where a.site=:site");
		   	q.setParameter("site", site);
		   	retorno = (Anunciante) q.getSingleResult();
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}

	/**
	 * Validar o login do usuario
	 * @param email
	 * @param senha
	 * @return
	 */
	public Anunciante validarLogin(String email, String senha) {
		Anunciante retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select a from Anunciante a where a.email=:email and a.senha=:senha");
		   	q.setParameter("email", email);
		   	q.setParameter("senha",senha);
	
		   	retorno = (Anunciante) q.getSingleResult();
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			 logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
		}
	
	/**
	 * Recuperar senha
	 * @param email
	 * @return
	 */
	public String recuperarSenha(String email) {
		String retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select a.senha from Anunciante a where a.email=:email");
		   	q.setParameter("email", email);
	
			retorno = (String)  q.getSingleResult();
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}
	
	
	
}
